package com.xflib.shardingsphere.utils;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;

import java.util.HashSet;
import java.util.Set;

/**
 * Spring BeanUtils extension
 *
 * @author koradji
 */
public class CustomBeanUtils {

    /**
     * 复制源对象属性到目标对象，忽略源对象中值为null的属性
     *
     * @param src    源对象，提供属性值的对象
     * @param target 目标对象，接收属性值的对象
     *
     * 实现说明：
     * 1. 通过BeanUtils工具类执行属性复制操作
     * 2. 使用getNullPropertyNames方法获取源对象中值为null的属性名称数组
     * 3. 在复制过程中自动跳过这些null值属性，保留目标对象原有值
     */
    public static void copyPropertiesIgnoreNull(Object src, Object target) {
        BeanUtils.copyProperties(src, target, getNullPropertyNames(src));
    }


    private static String[] getNullPropertyNames(Object source) {
        final BeanWrapper src = new BeanWrapperImpl(source);
        java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();

        Set<String> emptyNames = new HashSet<>();
        for (java.beans.PropertyDescriptor pd : pds) {
            Object srcValue = src.getPropertyValue(pd.getName());
            if (srcValue == null) emptyNames.add(pd.getName());
        }
        String[] result = new String[emptyNames.size()];
        return emptyNames.toArray(result);
    }
}

